package com.bootdo.app.dto.wx;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import lombok.Builder;
import lombok.Data;

/**
 * @auther: Along
 * @description: 微信模板消息请求类
 *
 * POST数据示例如下：
 * {
 *      "touser":"OPENID",
 *      "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
 *      "url":"http://weixin.qq.com/download",
 *      "miniprogram":{
 *          "appid":"xiaochengxuappid12345",
 *          "pagepath":"index?foo=bar"
 *       },
 *       "data":{
 *          "first": {
 *              "value":"恭喜你购买成功！",
 *              "color":"#173177"
 *          },
 *          "keyword1":{
 *              "value":"巧克力",
 *              "color":"#173177"
 *          },
 *          "keyword2": {
 *              "value":"39.8元",
 *              "color":"#173177"
 *          },
 *          "keyword3": {
 *              "value":"2014年9月22日",
 *              "color":"#173177"
 *          },
 *          "remark":{
 *              "value":"欢迎再次购买！",
 *              "color":"#173177"
 *          }
 *      }
 *  }
 */
@Data
@Builder
public class TemplateMsgRequest {

    /**
     * 接收者openid (必需)
     */
    private String touser;

    /**
     * 模板ID （必需）
     */
    private String template_id;

    /**
     * 模板跳转链接（海外帐号没有跳转能力） (非必需)
     */
    private String url;

    /**
     * 跳小程序所需数据，不需跳小程序可不用传该数据 (非必须)
     */
    private MiniProgram miniprogram;

    /**
     * 模板数据 （必需）
     * Key：模板参数字段名称
     * value：模板参数值对象
     */
    private Map<String,DataObj> data;

    // 小程序对象
    @Data
    @Builder
    static class MiniProgram{
        /**
         * 所需跳转到的小程序appid（该小程序appid必须与发模板消息的公众号是绑定关联关系，暂不支持小游戏）（必需）
         */
        private String appid;
        /**
         * 所需跳转到小程序的具体页面路径，支持带参数,（示例index?foo=bar），要求该小程序已发布，暂不支持小游戏 （非必需）
         */
        private String pagepath;
    }

    // 模板数据对象
    @Data
    @Builder
    static class DataObj{
        /**
         * 参数值
         */
        private String value;
        /**
         * 模板内容字体颜色，不填默认为黑色
         */
        private String color;
    }

    /**
     * 模板：新会员加入通知
     * @param toUserOpenId  接收者openid
     * @param url 跳转url
     * @param userNickName 会员编号：编号（微信名）
     * @return
     */
    public static TemplateMsgRequest createNewUserJoin(String toUserOpenId,String url,String userNickName,String joinTime,String mbId){
        Map<String,DataObj> data = new HashMap<>();
        data.put("first",DataObj.builder().value("恭喜您，有新会员加入").color("#173177").build());
        // 会员编号：编号（微信名）
        data.put("keyword1",DataObj.builder().value(userNickName).color("#173177").build());
        // 加入时间
        data.put("keyword2",DataObj.builder().value(joinTime).color("#173177").build());
        data.put("remark",DataObj.builder().value("新会员加入").color("#173177").build());
        TemplateMsgRequestBuilder builder = TemplateMsgRequest.builder();
        builder.touser(toUserOpenId);
        if(StringUtils.isNotEmpty(url)){
            builder.url(url);
        }
        return builder.template_id(mbId).data(data).build();
    }

    /**
     * 模板：新订单提醒
     * @param toUserOpenId 接收者openid
     * @param url 跳转url
     * @param orderName 订单名称
     * @param orderTime 下单时间
     * @param orderMoney 订单金额
     * @param commission 订单佣金
     * @return
     */
    public static TemplateMsgRequest createNewOrder(String toUserOpenId,String url,String orderName,String orderTime,String orderMoney,String commission,String mbId){
        Map<String,DataObj> data = new HashMap<>();
        data.put("first",DataObj.builder().value("您刚刚有一条新订单").color("#173177").build());
        // 订单名称
        data.put("keyword1",DataObj.builder().value(orderName).color("#173177").build());
        // 下单时间
        data.put("keyword2",DataObj.builder().value(orderTime).color("#173177").build());
        // 订单金额
        data.put("keyword3",DataObj.builder().value(orderMoney + "元").color("#173177").build());
        // 订单信息
        data.put("keyword4",DataObj.builder().value("佣金约 ￥" + getDouble2String(commission)).color("#173177").build());
        // 备注
        data.put("remark",DataObj.builder().value("该笔订单确认收货后，24小时内自动返现到你的账号钱包！").color("#173177").build());
        TemplateMsgRequestBuilder builder = TemplateMsgRequest.builder();
        builder.touser(toUserOpenId);
        if(StringUtils.isNotEmpty(url)){
            builder.url(url);
        }
        return builder.template_id(mbId).data(data).build();
    }
    
    /**
     * 模板：新订单提醒
     * @param toUserOpenId 接收者openid
     * @param url 跳转url
     * @param orderName 订单名称
     * @param orderTime 下单时间
     * @param orderMoney 订单金额
     * @param commission 订单佣金
     * @return
     */
    public static TemplateMsgRequest createNewOrder2(String toUserOpenId,String url,String orderName,String orderTime,String orderMoney,String commission,String mbId){
        Map<String,DataObj> data = new HashMap<>();
        data.put("first",DataObj.builder().value("您的下级刚刚有一条新订单").color("#173177").build());
        // 订单名称
        data.put("keyword1",DataObj.builder().value(orderName).color("#173177").build());
        // 下单时间
        data.put("keyword2",DataObj.builder().value(orderTime).color("#173177").build());
        // 订单金额
        data.put("keyword3",DataObj.builder().value(orderMoney + "元").color("#173177").build());
        // 订单信息
        data.put("keyword4",DataObj.builder().value("佣金约 ￥" + getDouble2String(commission)).color("#173177").build());
        // 备注
        data.put("remark",DataObj.builder().value("该笔订单确认收货后，24小时内自动返现到你的账号钱包！").color("#173177").build());
        TemplateMsgRequestBuilder builder = TemplateMsgRequest.builder();
        builder.touser(toUserOpenId);
        if(StringUtils.isNotEmpty(url)){
            builder.url(url);
        }
        return builder.template_id(mbId).data(data).build();
    }
    
    /**
     * 模板：新订单提醒
     * @param toUserOpenId 接收者openid
     * @param url 跳转url
     * @param orderName 订单名称
     * @param orderTime 下单时间
     * @param orderMoney 订单金额
     * @param commission 订单佣金
     * @return
     */
    public static TemplateMsgRequest createNewOrder3(String toUserOpenId,String url,String orderName,String orderTime,String orderMoney,String commission,String mbId){
        Map<String,DataObj> data = new HashMap<>();
        data.put("first",DataObj.builder().value("您的下下级刚刚有一条新订单").color("#173177").build());
        // 订单名称
        data.put("keyword1",DataObj.builder().value(orderName).color("#173177").build());
        // 下单时间
        data.put("keyword2",DataObj.builder().value(orderTime).color("#173177").build());
        // 订单金额
        data.put("keyword3",DataObj.builder().value(orderMoney + "元").color("#173177").build());
        // 订单信息
        data.put("keyword4",DataObj.builder().value("佣金约 ￥" + getDouble2String(commission)).color("#173177").build());
        // 备注
        data.put("remark",DataObj.builder().value("该笔订单确认收货后，24小时内自动返现到你的账号钱包！").color("#173177").build());
        TemplateMsgRequestBuilder builder = TemplateMsgRequest.builder();
        builder.touser(toUserOpenId);
        if(StringUtils.isNotEmpty(url)){
            builder.url(url);
        }
        return builder.template_id(mbId).data(data).build();
    }

    /**
     * 订单确认收货通知
     * @param toUserOpenId 接收者openid
     * @param url 跳转url
     * @param orderName 订单名字
     * @param orderNum 订单编号
     * @param goodsName 商品名称
     * @param orderTime 下单时间
     * @param shippingTime 发货时间
     * @param confirmOrderTime 确认收货时间
     * @param commission 佣金
     * @return
     */
    public static TemplateMsgRequest createOrderConfirm(String toUserOpenId,String url,String orderName,String orderNum,String goodsName,String orderTime,String shippingTime,String confirmOrderTime,String commission,String mbId){
        Map<String,DataObj> data = new HashMap<>();
        data.put("first",DataObj.builder().value("亲：您的订单["+orderName+"]已经确认收货了").color("#173177").build());
        // 订单号
        data.put("keyword1",DataObj.builder().value(orderNum).color("#173177").build());
        // 商品名称
        data.put("keyword2",DataObj.builder().value(goodsName).color("#173177").build());
        // 下单时间
        data.put("keyword3",DataObj.builder().value(orderTime).color("#173177").build());
        // 发货时间
        data.put("keyword4",DataObj.builder().value(shippingTime).color("#173177").build());
        // 确认收货时间
        data.put("keyword5",DataObj.builder().value(confirmOrderTime).color("#173177").build());
        // 备注
        data.put("remark",DataObj.builder().value("本单佣金："+getDouble2String(commission)+"元，佣金将于24小时内结算到您的账户钱包").color("#173177").build());
        TemplateMsgRequestBuilder builder = TemplateMsgRequest.builder();
        builder.touser(toUserOpenId);
        if(StringUtils.isNotEmpty(url)){
            builder.url(url);
        }
        return builder.template_id(mbId).data(data).build();
    }

    /**
     * 模板：余额变动提示
     * @param toUserOpenId 接收者openid
     * @param url 跳转url
     * @param changeTime 变动时间
     * @param changeInfo 变动类型（变动描述）
     * @param changeAmount 变动金额
     * @param nowBalance 当前余额
     * @return
     */
    public static TemplateMsgRequest createBalanceChange(String toUserOpenId,String url,String changeTime,String changeInfo,String changeAmount,String nowBalance,String mbId){
        Map<String,DataObj> data = new HashMap<>();
        data.put("first",DataObj.builder().value("您好，您有一笔余额变动！").color("#173177").build());
        // 变动时间
        data.put("keyword1",DataObj.builder().value(changeTime).color("#173177").build());
        // 变动类型
        data.put("keyword2",DataObj.builder().value(changeInfo).color("#173177").build());
        // 变动金额
        data.put("keyword3",DataObj.builder().value(getDouble2String(changeAmount) + "元").color("#173177").build());
        // 当前余额
        data.put("keyword4",DataObj.builder().value(getDouble2String(nowBalance) + "元").color("#173177").build());
        // 备注
        data.put("remark",DataObj.builder().value("详情请点击此消息进入会员中心进行查看!").color("#173177").build());
        TemplateMsgRequestBuilder builder = TemplateMsgRequest.builder();
        builder.touser(toUserOpenId);
        if(StringUtils.isNotEmpty(url)){
            builder.url(url); // todo 此处写死 进入会员中心查看的url  / 小程序
        }
        return builder.template_id(mbId).data(data).build();
    }
    
    /**
     * 模板：余额变动提示
     * @param toUserOpenId 接收者openid
     * @param url 跳转url
     * @param changeTime 变动时间
     * @param changeInfo 变动类型（变动描述）
     * @param changeAmount 变动金额
     * @param nowBalance 当前余额
     * @return
     */
    public static TemplateMsgRequest createKjcg(String toUserOpenId,String url,String changeTime,String changeAmount,String msg,String mbId){
        Map<String,DataObj> data = new HashMap<>();
        data.put("first",DataObj.builder().value("拼团").color("#173177").build());
        // 砍价结果：
        data.put("keyword1",DataObj.builder().value(msg).color("#173177").build());
        // 砍价时间：
        data.put("keyword2",DataObj.builder().value(changeTime).color("#173177").build());
        // 当前价格：
        data.put("keyword3",DataObj.builder().value(changeAmount + "元").color("#173177").build());
        // 备注
        data.put("remark",DataObj.builder().value("拼团(只支持新用户)").color("#173177").build());
        TemplateMsgRequestBuilder builder = TemplateMsgRequest.builder();
        builder.touser(toUserOpenId);
        if(StringUtils.isNotEmpty(url)){
            builder.url(url); // todo 此处写死 进入会员中心查看的url  / 小程序
        }
        return builder.template_id(mbId).data(data).build();
    }

    private static Double getDouble2String(String num) {
		if(StringUtils.isNoneBlank(num)) {
			Double cny = Double.parseDouble(num);
			DecimalFormat df = new DecimalFormat("0.00"); 
			String CNY = df.format(cny);
			Double cny1 = Double.parseDouble(CNY);
			return cny1;
		}
		return 0.00;
	}
}
